﻿#include <algorithm>
#include <iostream>

using namespace std;

struct node {
    int l, r;
    bool operator<(node b) {
        if (l == b.l) {
            return r > b.r;
        }
        return l < b.l;
    }
}g[100005];

// 小Q在进行一场竞技游戏,这场游戏的胜负关键就在于能否能争夺一条长度为L的河道,即可以看作是[0,L]的一条数轴。
// 这款竞技游戏当中有n个可以提供视野的道具−真视守卫, 第i个真视守卫能够覆盖区间[xi, yi]。
// 现在小Q想知道至少用几个真视守卫就可以覆盖整段河道。
// 
// 思路:
// 按左端点从小到大，右端点从大到小排序，每次看一个区间能里的点往右最大能延伸到哪（mx），
// 下次更新上限（up）的时候就用这个mx。这个过程和leetcode跳跃游戏那题很像。
int main_VisionWard() {
    int n, L;
    scanf_s("%d%d", &n, &L);
    for (int i = 0; i < n; i++) {
        scanf_s("%d%d", &g[i].l, &g[i].r);
    }
    
    sort(g, g + n);
    int up = g[0].r, mx = g[0].r, cnt = 1;
    if (g[0].l > 0) {
        printf("-1\n");
        return 0;
    }
    
    for (int i = 1; i < n; i++) {
        if (g[i].l <= up) {
            mx = max(g[i].r, mx);
            if (mx >= L) {
                printf("%d\n", cnt + 1);
                return 0;
            }
        }
        else {
            cnt++;
            up = max(up, mx);

            i--;
        }
    }
    
    if (mx < L) {
        printf("-1\n");
        return 0;
    }
    
    printf("%d\n", cnt);
    return 0;
}